package com.rabbitmq.demos.simple;

import com.rabbitmq.client.*;
import com.rabbitmq.utils.ConnectionUtil;
import com.rabbitmq.utils.RabbitConfig;

import java.io.IOException;

public class Customer {

    public static void main(String[] args) throws Exception {

        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        /***
         * 1.声明队列queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
         *      queue：队列名称
         *
         *      durable：是否持久化, 队列的声明默认是存放到内存中的，如果rabbitmq重启会丢失，如果想重启之后还存在就要使队列
         *
         *                      持久化，保存到Erlang自带的Mnesia数据库中，当rabbitmq重启之后会读取该数据库
         *
         *      exclusive：是否排外的。 两个作用：
         *
         *                      （当设置true:只能存在一个消费者,声明队列连接关闭队列自动删除;false：多个消费者,连接关闭队列不会删除）
         *
         *                      1.当关闭声明队列连接时connection.close()该队列是否会自动删除
         *
         *                      2.该队列是否是私有的private，如果设置true，只能有一个消费者
         *
         *      autoDelete：是否自动删除。当最后一个消费者断开连接之后，自动删除队列。
         *
         *      arguments：map类型参数。下面表示map中key代表的含义
         *
         *                           x-message-ttl：设置队列中的所有消息的生存周期
         *
         *                           x-expires：当队列在指定的时间没有被访问，队列就会删除
         *
         *                           x-max-length：限定队列的消息的最大值长度，超过指定长度将会把最早的几条删除掉
         *
         *                           x-max-length-bytes：限定队列最大占用的空间大小
         *
         *                           x-overflow：
         *
         *                          x-dead-letter-exchange：当队列消息长度大于最大长度、或者过期的等，将从队列中删除的消息推送到指定的交换机中去而不是丢弃掉
         *
         *                          x-dead-letter-routing-key：将删除的消息推送到指定交换机的指定路由键的队列中去
         *
         *                          x-max-priority：优先级队列，声明队列时先定义最大优先级值(定义最大值一般不要太大)，在发布消息的时候指定该消息的优先级， 优先级更高（数值更大的）的消息先被消费
         *
         *                          x-queue-mode：Lazy Queues: 先将消息保存到磁盘上，不放在内存中，当消费者开始消费的时候才加载到内存中
         *
         *                          x-queue-master-locator：

         */
        channel.queueDeclare(RabbitConfig.queue, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            long deliveryTag = delivery.getEnvelope().getDeliveryTag();
            String message = new String(delivery.getBody());
            System.out.println("client接收消息：" + message + ",deliveryTag:" + deliveryTag);
        };
        /**
         * 3.接收消息:basicConsume(String queue, boolean autoAck, Consumer callback);
         *      queue：队列名字
         *
         *      autoAck：是否自动确认消息,true自动确认,false 不自动要手动调用
         *
         *      callback：实现Consumer接口：
         */
        channel.basicConsume(RabbitConfig.queue, true, deliverCallback, consumerTag -> {
            System.out.println("onsumerTag is: "+consumerTag);
        });
    }
}
